package com.cl.pattern.singleton.lazy;

/**
 * '懒汉式' 单例
 * 类加载的时候创建实例，等到用的时候才去创建
 * 绝对的线程安全，在线程还没创建之前就已经实例化了，不可能存在访问安全问题
 *
 * @Author Small
 * @Date 2020/5/30 10:52
 * @Version 1.0
 **/
public class LazyThree {


    /**
     * 静态的本类实例
     */
    private static LazyThree lazy = null;


    /**
     * 私有的构造方法
     */
    private LazyThree() {
    }


    /**
     * 公共的静态获取实例的方法
     * @return
     */
    public static LazyThree getInstance() {

        /*
         * 调用方法前先判断是否已经初始化了实例
         * 如果没有初始化，new 一个对象进行初始化
         *
         */
        if (null == lazy) {
            // 同步代码块放这里，不会每次调用获取实例的方法都加锁，提高了效率
            synchronized (LazyThree.class) {
                // 双重判断确保创建的实例唯一
                if (null == lazy) {
                    lazy = new LazyThree();
                }
            }
        }
        return lazy;
    }
}
